'use strict';
const crypto = require('crypto');
const Controller = require('egg').Controller;

class UserController extends Controller {
  async reg() {
    let {app,ctx}=this
    ctx.validate({
        username:{
            type:'string',
            require:true,
            range:{
                min:5,
                max:20
            },
            desc:'用户名'
        },
        password:{
            type:'string',
            require:true,
            desc:'密码'
        },
        repassword:{
            type:'string',
            require:true,
            desc:'确认密码',
            equals:['repassword','password']
        }
    })
    let {username,password}=ctx.request.body
    // 查询用户是否存在
    let checkUser=await app.model.User.findOne({
        where:{
            username
        }
    })
    if(checkUser){
        return ctx.apiFail('用户已存在')
    }

    // 创建一个用户
    let user=await app.model.User.create({
        username,
        password
    })
    // 判断用户创建成功
    if(!user){
      return  ctx.apiFail('注册失败')
    }
    // 放回用户信息回去
    ctx.apiSuccess(user)
  }
//   用户登录
async login(){
    // 结构数据
    let {app,ctx}= this
    // 结构参数
    let {username,password}=ctx.request.body
    // 参数验证
    ctx.validate({
        username:{
            type:'string',
            require:true,
            desc:'用户名'
        },
        password:{
            type:'string',
            require:true,
            desc:'密码'
        },
    })
    // 判断用户是否存在
    let user=await app.model.User.findOne({
        where:{
            username
        }
    })
    if(!user){
       return ctx.apiFail('用户不存在')
    }
    // 验证密码是否正确
    await this.checkPassword(password,user.password)
    // 生成token
    // 为什么要做一下操作，是什么原因呢
    user = JSON.parse(JSON.stringify(user));
    let token=ctx.getToken(user)
    user.token=token
    // 存入 Redis
    delete user.password
    if(!await this.service.cache.set('user_'+user.id,token)){
        ctx.throw(400,'登录失败')
    }
    // 返回用户信息和token
    return ctx.apiSuccess(user)
}

// 用户登出操作
async logout(){
    // 结构
    let {ctx,service}=this
    // 拿到用户id
    let current_user_id=ctx.authUser.id
    // 移除用户redis的缓存
    if(!await service.cache.remove('user_'+current_user_id)){
        return ctx.throw(400,'退出登录失败')
    }
    // 返回
    ctx.apiSuccess('退出成功')
}

// check 密码
async checkPassword(password, hash_password) {
    // 先对需要验证的密码进行加密
    const hmac = crypto.createHash("sha256", this.app.config.crypto.secret);
    hmac.update(password);
    password = hmac.digest("hex");
    let res = password === hash_password;
    if (!res) {
        this.ctx.throw(400, '密码错误');
    }
    return true;
}

// 获取用户容量
async getSize(){
    const {app,ctx}=this
    return ctx.apiSuccess({
        total_size:ctx.authUser.total_size,
        used_size:ctx.authUser.used_size
    })
}

}

module.exports = UserController;
